package com.bana.sys.protocol;

import io.netty.channel.ChannelHandlerContext;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

/**
 * 集群协议
 * @author Administrator
 *
 */
public class Protocol {

	/**
	 * 集群协议头长度 0xAB+协议编号(1)+协议长度(2)+时间戳(8)
	 */
	public static final int HeadSize=13;

	/**
	 * 发送时间戳
	 */
	private long millis;

	/**
	 * 集群协议编号
	 * @return 集群协议编号
	 */
	public short getId()
	{
		return 0;
	}

	/**
	 * 获取发送时间戳
	 * @return 发送时间戳
	 */
	public long getStampTime()
	{
		return millis;
	}

	public byte[] request() {
		return fillHead(new byte[0]);
	}

	protected byte[] fillHead(byte[] buffer)
	{
		try
		{
			//添加协议头
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			DataOutputStream dos = new DataOutputStream(baos);
			dos.writeByte(0xAB);
			dos.writeShort(getId());
			dos.writeShort(buffer.length);
			//时间戳
//			millis = Calendar.getInstance().getTimeInMillis();
			Date dd = Calendar.getInstance().getTime();
			millis = dd.getTime();
			dos.writeLong(millis);
			dos.write(buffer);
			byte[] temp= baos.toByteArray();
			dos.close();
			baos.close();
			return temp;
		}
		catch (Exception e)
		{
			return null;
		}
	}

	/**
	 * 获取集群协议响应字节流
	 * @param context 字节流来源
	 * @param requestBuffer 收到的请求字节流
	 * @param timeStamp 收到的时间吹
	 * @return 响应字节流，不需要响应或出现异常返回null
	 */
	public byte[] response(ChannelHandlerContext context,byte[] requestBuffer, long timeStamp)
	{
		try
		{
			//获取请求协议
			byte[] buffer=responseCore(context,requestBuffer,timeStamp);
			if(buffer==null)
			{
				return null;
			}
			//添加协议头
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			DataOutputStream dos = new DataOutputStream(baos);
			dos.writeByte(0xAB);
			dos.writeShort(getId());
			dos.writeShort(buffer.length);
			dos.writeLong(timeStamp);
			dos.write(buffer);
			byte[] temp= baos.toByteArray();
			dos.close();
			baos.close();
			return temp;
		}
		catch (Exception e) {
			return null;
		}
	}

	/**
	 * 获取集群协议响应字节流
	 * @param context 字节流来源
	 * @param requestBuffer 收到的请求字节流
	 * @param timeStamp 收到的时间吹
	 * @return 响应字节流，不需要响应或出现异常返回null
	 */
	protected byte[] responseCore(ChannelHandlerContext context,byte[] requestBuffer,long timeStamp) throws IOException {
		return new byte[0];
	}
}
